home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DTP / DTP_TEX / H220.ZIP / ITRNS211.ZIP / SRC / PIFM.C < prev    next >
C/C++ Source or Header  |  1991-10-08  |  5KB  |  165 lines

  1. /*
  2.  *========================================================================== 
  3.  * Copyright 1991 Avinash Chopde, All Rights Reserved.
  4.  *
  5.  * Permission to use, copy, modify and distribute this software and its
  6.  * documentation for any purpose is hereby granted without fee, provided that
  7.  * the above copyright notice appear in all copies and that both that
  8.  * copyright notice and this permission notice appear in supporting
  9.  * documentation, and that the name of Avinash Chopde not be used in
  10.  * advertising or publicity pertaining to distribution of the software
  11.  * without specific, written prior permission.
  12.  * Avinash Chopde makes no representations about the suitability of this
  13.  * software for any purpose.
  14.  * It is provided "as is" without express or implied warranty.
  15.  *
  16.  * AVINASH CHOPDE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  17.  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
  18.  * IN NO EVENT SHALL AVINASH CHOPDE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  19.  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  20.  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  21.  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  22.  * OF THIS SOFTWARE.
  23.  *
  24.  * Author:  Avinash Chopde, 1991
  25.  *        C2 Colonial Drive #4, Andover, MA 01810, USA.
  26.  *
  27.  */
  28.  
  29. static char S_RCSID[] = "$Header: e:/itrans/src/rcs/pifm.c 1.5 91/10/07 23:27:42 avinash Exp $";
  30.  
  31. #include "itrans.h"
  32. #include "ifm.h"
  33.  
  34. #define IFMLINELEN_MAX        1024
  35. #define IFMLINE_STR        "Comment -I-"
  36. #define IFMCOMMENT_STR        "Comment"
  37. #define IFMCOMMENT_CHR        '%'
  38. #define CCS_STR            "CCS"
  39. #define CC_STR            "CC"
  40. #define CCADD_STR        "CCADD"
  41. #define PCC_STR            "PCC"
  42. #define FONT_STR        "FONT"
  43. #define PROP_STR        "PROP"
  44. #define NONE_STR        "none"
  45. #define IMPLICIT_STR        "implicit"
  46. #define STARTI_STR        "StartINDIAN"
  47. #define ENDI_STR        "EndINDIAN"
  48.  
  49. int G_ifm_lineno = 0;
  50.  
  51. /* ==================================================================== */
  52. /* extract a word from the given char pointer, and increment the pointer.
  53.  * The char pointer is assumed to point to a string as returned
  54.  * by fgets() - terminated by "\n\0"
  55.  */
  56.  
  57. static int xtract_word(char** cptr, char word[])
  58. {
  59.     int ch, i;
  60.  
  61.     if (!*cptr)    return FALSE; /* error, NULL pointer */
  62.  
  63.     if (**cptr == '\n' || **cptr == '\0') return FALSE; /* eoln */
  64.  
  65.     /* skip spaces */
  66.     ch = *(*cptr)++;
  67.     while (ch == ' ' || ch == '    ' || ch == ';') { /* space, tab, semicolon */
  68.     ch = **cptr;
  69.         if (ch == '\n' || ch == '\0')    return FALSE; /* eoln */
  70.     (*cptr)++;
  71.     }
  72.  
  73.     /* extract word */
  74.     i = 0;
  75.     while (ch != '\n' && ch != ' ' && ch != '    ' && ch != ';') {
  76.             /* nl, space, tab, semicolon */
  77.     word[i++] = ch;
  78.     ch = *(*cptr)++;
  79.     }
  80.  
  81.     word[i] = '\0';
  82.     return i;
  83. }
  84.  
  85. /* ==================================================================== */
  86. static int get_next_ifm_line(char* iline, int n, FILE* fp)
  87. {
  88.      G_ifm_lineno++;
  89.      if (!fgets(iline, n, fp)) return FALSE; /* EOF */
  90.  
  91.      /* check for valid line - starts with "Comment -I-" */
  92.      while (strncmp(iline, IFMLINE_STR, strlen(IFMLINE_STR))) {
  93.          G_ifm_lineno++;
  94.          if (!fgets(iline, n, fp)) return FALSE; /* EOF */
  95.      }
  96.  
  97.      return TRUE;
  98. }
  99.  
  100. /* ==================================================================== */
  101. /* externally visible function, returns the next IFM token in word, and
  102.  * does some pattern matching
  103.  * Returns the TAG depending on the word (CC, CCS, etc) -see ifm.h
  104.  */
  105. static char S_line[IFMLINELEN_MAX] = "\0";
  106. static char* S_cptr = &S_line[0];
  107.  
  108. int get_ifm_token(FILE* fp, char* word)
  109. {
  110.     int s;
  111.  
  112.     s = xtract_word(&S_cptr, word);
  113.     if (!s) {
  114.     do {
  115.         if (!get_next_ifm_line(S_line, IFMLINELEN_MAX, fp))
  116.         return FALSE; /* EOF */
  117.         S_cptr = &S_line[strlen(IFMLINE_STR) + 1];
  118.         word[0] = '\0';
  119.         s = xtract_word(&S_cptr, word);
  120.     } while (!s);
  121.     }
  122.  
  123.     /* decipher word */
  124.     if (       !strcmp(word, STARTI_STR)
  125.         || !strcmp(word, ENDI_STR)
  126.             || !strcmp(word, IFMCOMMENT_STR)
  127.         || (word[0] == IFMCOMMENT_CHR)) {
  128.         /* dump the rest of the line, is a comment */
  129.  
  130.     S_line[0] = '\0';
  131.     S_cptr = &S_line[0];
  132.     return COMMENT_IFMTAG;
  133.     }
  134.  
  135.     if (!strcmp(word, CCS_STR))        return CCS_IFMTAG;
  136.     if (!strcmp(word, CC_STR))        return CC_IFMTAG;
  137.     if (!strcmp(word, CCADD_STR))    return CCADD_IFMTAG;
  138.     if (!strcmp(word, PCC_STR))        return PCC_IFMTAG;
  139.     if (!strcmp(word, FONT_STR))    return FONT_IFMTAG;
  140.     if (!strcmp(word, PROP_STR))    return PROP_IFMTAG;
  141.     if (!strcmp(word, NONE_STR))    return NONE_IFMTAG;
  142.     if (!strcmp(word, IMPLICIT_STR))    return IMPLICIT_IFMTAG;
  143.  
  144.     /* now, check for it being a number "+-digits" or "s+-digits" */
  145.     if (isdigit(word[0]))        return NUMBER_IFMTAG;
  146.     if (isdigit(word[1]) && (word[0] == '+' || word[0] == '-'))
  147.     return NUMBER_IFMTAG;
  148.     if (isdigit(word[1]) && word[0] == 's')    return DELTAS_IFMTAG;
  149.     if (isdigit(word[2]) && word[0] == 's' &&
  150.                     (word[1] == '+' || word[1] == '-'))
  151.     return DELTAS_IFMTAG;
  152.  
  153.     /* finally, must be a DNAME_IFMTAG [*-.a-zA-Z0-9]* */
  154.  
  155.     return DNAME_IFMTAG;
  156. }
  157. /* ==================================================================== */
  158. void reset_pifm()
  159. {
  160.     G_ifm_lineno = 0;
  161.     S_line[0] = '\0';
  162.     S_cptr = &S_line[0];
  163. }
  164. /* ===========================^ pifm.c ^ ============================== */
  165.